package main

import "fmt"

// 函数是非常重要的内容，在map中，函数可以作为参数，也可以作为返回值
func plus(a int, b int) int {
	return a + b
}

func plusPlus(a, b, c int) int {
	return a + b + c
}

// 多返回值函数
func multiple() (int, string) {
	return 2, "2"
}

// 不定值参数函数
func Variadic(nums ...int) {
	fmt.Print(nums, " ")
	total := 0
	for _, v := range nums {
		total += v
	}
	fmt.Println(total)
}

// 闭包
func Closures() func() int {
	i := 0
	return func() int {
		i++
		return i
	}
}

// 递归函数
func Recursion(i int) int {
	if i == 0 {
		return 1
	}
	return i * Recursion(i-1)
}

func main() {
	i := plus(1, 3)
	fmt.Println(i)
	i2 := plusPlus(1, 2, 3)
	fmt.Println(i2)
	i3, s := multiple()
	fmt.Println(i3)
	fmt.Println(s)
	i4, _ := multiple()
	fmt.Println(i4)

	Variadic(1, 2, 3)
	Variadic(1, 2, 3, 4, 5)

	closures := Closures()
	fmt.Println(closures())
	fmt.Println(closures())

	// 斐波那契函数
	var fib func(i int) int
	fib = func(i int) int {
		if i < 2 {
			return i
		}
		return fib(i-1) + fib(i-2)
	}
	fmt.Println(fib(7))
	fmt.Println("Recursion,", Recursion(7))
}
